#!/usr/bin/env python

import getopt,sys
import subprocess
from random import randint,seed
from math import sqrt

def runtest(li,args):
	# abro ./amigos con parametros: time 0.1 3
	fp=subprocess.Popen(['./amigos']+args, shell=False, stdin=subprocess.PIPE,stdout=subprocess.PIPE)
	for i in li:
		fp.stdin.write(str(i)+"\n") # le mando el numero
		r=fp.stdout.readline().rstrip() # recibo el resultado
		print "n=",i," ",args[0],"=",r
		yield i,r # lo devuelvo

def isPrime(n):
	if n==2 or n==3: return True
	if n==1 or n%2==0 or n%3==0: return False
	for m in range(6,int(sqrt(n))+2,6):
		if n==25: print m
		if n%(m+1)==0 or n%(m-1)==0: return False
	return True

def usage():
	print "Usage:"
	print "-t (o --time) para calcular tiempos"
	print "-c (o --count) para contar operaciones"
	sys.exit(2)

try:
	opts, args = getopt.getopt(sys.argv[1:], "tc", ["time", "count"])
except getopt.GetoptError, err:
	# print help information and exit:
	print str(err) # will print something like "option -a not recognized"
	usage()
if not opts: usage()

opts=map(lambda x: x[0],opts)

seed(1234) # defino el seed para hacer el experimento reproducible
ns=[x+randint(0,1000000) for x in range(1,1000000000,1000000)] # genero la lista de los casos de prueba
# son numeros del 1 al 10000, tomando uno random de cada 20
outn=outp=""
if "--time" in opts or "-t" in opts:
	for i in runtest(ns,['time','0.06','3']): # para cada caso de prueba...
		vals=map(float,i[1].split()) # obtengo la lista de los tiempos
		val=reduce(lambda x,y:x+y,vals)/len(vals) # tomo el primedio
		err=max([abs(x-val) for x in vals]) # calculo el error
		dat = (str(i[0])+"\t"+ "%.8f"%val +"\t"+ "%.8f"%err +"\n") # lo preparo para el archivo de salida
		# pongo en un bloque separado los numeros primos del resto, para poder analizarlos aparte..
		if isPrime(i[0]): outp += dat
		else: outn += dat
	open('time_err.dat','w').write("#Not Primes\n"+outn+"\n\n#Primes\n"+outp) # lo guardo en el archivo
	print "\nOutput escrito a time_err.dat"

outn=outp=""
if "--count" in opts or "-c" in opts:
	for i in runtest(ns,['count']): #para cada caso de prueba..
		dat = str(i[0])+"\t"+i[1]+"\n" # lo formateo para la salida
		if isPrime(i[0]): outp += dat
		else: outn += dat
	open('counts.dat','w').write("#Not Primes\n"+outn+"\n\n#Primes\n"+outp) # lo guardo en el archivo (separando primos del resto)
	print "\nOutput escrito a counts.dat"
